﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Не ПользователиСлужебный.ВнешниеПользователиВнедрены() Тогда
		Элементы.ОбъектАвторизации.Доступность = Ложь;
	КонецЕсли;
	
	// Заполнение вспомогательных данных.
	
	ЗапретРедактированияРолей = ПользователиСлужебный.ЗапретРедактированияРолей();
	
	// Заполнение списка выбора языка.
	Если Метаданные.Языки.Количество() < 2 Тогда
		Элементы.ПользовательИБЯзык.Видимость = Ложь;
	Иначе
		Для каждого МетаданныеЯзыка Из Метаданные.Языки Цикл
			Элементы.ПользовательИБЯзык.СписокВыбора.Добавить(
				МетаданныеЯзыка.Имя, МетаданныеЯзыка.Синоним);
		КонецЦикла;
	КонецЕсли;
	
	// Подготовка к интерактивным действиям с учетом сценариев открытия формы.
	УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(Объект);
	
	УстановитьПривилегированныйРежим(Истина);
	
	Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
		
		// Создание нового элемента.
		Если Параметры.ГруппаНовогоВнешнегоПользователя
		         <> Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи Тогда
			
			ГруппаНовогоВнешнегоПользователя = Параметры.ГруппаНовогоВнешнегоПользователя;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
			// Копирование элемента.
			ЗначениеКопирования = Параметры.ЗначениеКопирования;
			Объект.Наименование      = "";
			Объект.ОбъектАвторизации = Неопределено;
			ПользовательИБАдресЭлектроннойПочты = "";
			ИдентификаторКопируемогоПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
				ЗначениеКопирования, "ИдентификаторПользователяИБ");
			
			Если Не ПользователиСлужебный.УровеньДоступаПользователяВыше(ЗначениеКопирования, УровеньДоступа) Тогда
				ПрочитатьПользователяИБ(ЗначениеЗаполнено(ИдентификаторКопируемогоПользователяИБ));
			Иначе
				ПрочитатьПользователяИБ();
			КонецЕсли;
			
			Если Не УровеньДоступа.ИзменениеРазрешенияНаВход Тогда
				ВходВПрограммуРазрешен = Ложь;
				ВходВПрограммуРазрешенЗначениеПрямогоИзменения = Ложь;
			КонецЕсли;
		Иначе
			// Добавление элемента.
			Если Параметры.Свойство("ОбъектАвторизацииНовогоВнешнегоПользователя") Тогда
				
				Объект.ОбъектАвторизации = Параметры.ОбъектАвторизацииНовогоВнешнегоПользователя;
				ОбъектАвторизацииЗаданПриОткрытии = ЗначениеЗаполнено(Объект.ОбъектАвторизации);
				
			ИначеЕсли ЗначениеЗаполнено(ГруппаНовогоВнешнегоПользователя) Тогда
				
				НазначениеГруппыВнешнихПользователей = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
					ГруппаНовогоВнешнегоПользователя, "Назначение").Выгрузить();
				
				ОдинТипПользователей = НазначениеГруппыВнешнихПользователей.Количество() = 1;
				
				Если ОдинТипПользователей Тогда
					Объект.ОбъектАвторизации = НазначениеГруппыВнешнихПользователей[0].ТипПользователей;
				КонецЕсли;
				
				Элементы.ОбъектАвторизации.ВыбиратьТип = Не ОдинТипПользователей;
			КонецЕсли;
			
			// Чтение начальных значений свойств пользователя ИБ.
			ПрочитатьПользователяИБ();
			
			Если Не ЗначениеЗаполнено(Параметры.ИдентификаторПользователяИБ) Тогда
				ПользовательИБАутентификацияСтандартная = Истина;
				
				Если УровеньДоступа.ИзменениеРазрешенияНаВход Тогда
					ВходВПрограммуРазрешен = Истина;
					ВходВПрограммуРазрешенЗначениеПрямогоИзменения = Истина;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		Если УровеньДоступа.УправлениеСписком
		   И Объект.ОбъектАвторизации <> Неопределено Тогда
			
			ПользовательИБИмя = ПользователиСлужебныйКлиентСервер.ПолучитьКраткоеИмяПользователяИБ(
				ТекущееПредставлениеОбъектаАвторизации);
			
			ПользовательИБПолноеИмя = Объект.Наименование;
		КонецЕсли;
	Иначе
		// Открытие существующего элемента.
		ПрочитатьПользователяИБ();
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Ложь);
	
	ОбработатьИнтерфейсРолей("НастроитьИнтерфейсРолейПриСозданииФормы", Истина);
	НачальноеОписаниеПользователяИБ = НачальноеОписаниеПользователяИБ();
	
	НастроитьФорму(Объект, Истина);
	
	Если ОбъектАвторизацииЗаданПриОткрытии Тогда
		ОбъектАвторизацииПриИзмененииНаКлиентеНаСервере(ЭтотОбъект, Объект);
	КонецЕсли;
	
	Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда
		Элементы.ГруппаШапка.ТолькоПросмотр = Истина;
		Элементы.СтраницаДополнительныеРеквизиты.ТолькоПросмотр = Истина;
		Элементы.СтраницаКомментарий.ТолькоПросмотр = Истина;
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		ДополнительныеПараметры = Новый Структура;
		ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "СтраницаДополнительныеРеквизиты");
		ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина);
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
	КонецЕсли;
	
	ПарольДляПодтвержденияИзмененияПочты = Неопределено;
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		
		Если МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(Объект.ОбъектАвторизации)
		   И ЗначениеЗаполнено(Объект.ОбъектАвторизации) Тогда
			ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТипЗнч(Объект.ОбъектАвторизации));
			
			МодульУправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, ЭтотОбъект[ИмяРеквизитаОбъектАвторизации]);
			
			Если ПользователиСлужебный.ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Тогда
			
				Если Не ПользователиСлужебный.ИнтерактивноЗапрашиватьВводПароля(УровеньДоступа, Объект) Тогда
					ПарольДляПодтвержденияИзмененияПочты = "";
				КонецЕсли;
				
				ИмяРеквизитаСПочтойДляВосстановленияПароля = МодульУправлениеКонтактнойИнформацией.ОпределитьЭлементСПочтойДляВосстановленияПароля(
					ЭтотОбъект,
					ПользовательИБАдресЭлектроннойПочты,
					ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, Объект),
					Истина);
			
			КонецЕсли;
			
			Элементы.ГруппаКонтактнаяИнформация.Доступность = Пользователи.ЭтоПолноправныйПользователь();
			
		КонецЕсли;
	КонецЕсли;
	
	Если ОбщегоНазначения.РазделениеВключено()
		Или Не Пользователи.ОбщиеНастройкиВходаИспользуются() Тогда
		Элементы.ГруппаИзменитьОграничение.Видимость = Ложь;
	КонецЕсли;
	
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.Видимость = Ложь;
	КонецЕсли;
	
	Элементы.ПотребоватьСменуПароляПриВходе.РасширеннаяПодсказка.Заголовок =
		ПользователиСлужебный.ПодсказкаПотребоватьСменуПароляПриВходе(Истина);
	
	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		Элементы.ФормаЗаписатьИЗакрыть.Отображение = ОтображениеКнопки.Картинка;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		Если МодульУправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
			ОбновитьЭлементыДополнительныхРеквизитов();
			МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
		КонецЕсли;
	КонецЕсли;
	
	Если ВРег(ИмяСобытия) = ВРег("Запись_ГруппыДоступа") Тогда
		ПодключитьОбработчикОжидания("ПриИзмененияГруппыДоступа", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
	
	НастроитьФорму(ТекущийОбъект);
	
	ТекущееПредставлениеОбъектаАвторизации = Строка(Объект.ОбъектАвторизации);
	
	// СтандартныеПодсистемы.УправлениеДоступом
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
		МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
		МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.УправлениеДоступом
	
	// СтандартныеПодсистемы.КонтактнаяИнформация
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		Если МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(Объект.ОбъектАвторизации) Тогда
			ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТипЗнч(Объект.ОбъектАвторизации));
			МодульУправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтотОбъект, ЭтотОбъект[ИмяРеквизитаОбъектАвторизации]);
			
			Если ТипЗнч(УровеньДоступа) = Тип("Структура") И ПользователиСлужебный.ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Тогда
				ИмяРеквизитаСПочтойДляВосстановленияПароля = МодульУправлениеКонтактнойИнформацией.ОпределитьЭлементСПочтойДляВосстановленияПароля(
					ЭтотОбъект,
					ПользовательИБАдресЭлектроннойПочты,
					ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, Объект.ОбъектАвторизации), Истина);
			КонецЕсли;
			
		КонецЕсли;
	КонецЕсли;
	// Конец СтандартныеПодсистемы.КонтактнаяИнформация
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
	
	ОчиститьСообщения();
	ЗаголовокВопросов = НСтр("ru = 'Запись пользователя информационной базы'");
	
	// Копирование прав пользователя.
	Если ЗначениеЗаполнено(ЗначениеКопирования)
	   И Не ЗначениеЗаполнено(Объект.Ссылка)
	   И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом")
	   И (Не ПараметрыЗаписи.Свойство("НеКопироватьПраваПользователя")
	      И Не ПараметрыЗаписи.Свойство("КопироватьПраваПользователя")) Тогда
		
		Отказ = Истина;
		ПоказатьВопрос(
			Новый ОписаниеОповещения("ПослеОтветаНаВопросОКопированииПрав", ЭтотОбъект, ПараметрыЗаписи),
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Скопировать также права пользователя ""%1""?'"), Строка(ЗначениеКопирования)),
			РежимДиалогаВопрос.ДаНет,
			,
			,
			ЗаголовокВопросов);
		Возврат;
	КонецЕсли;
	
	Если ДействияВФорме.Роли = "Редактирование"
	   И Объект.УстановитьРолиНепосредственно
	   И ПользовательИБРоли.Количество() = 0 Тогда
		
		Если НЕ ПараметрыЗаписи.Свойство("СПустымСпискомРолей") Тогда
			Отказ = Истина;
			ПоказатьВопрос(
				Новый ОписаниеОповещения("ПослеОтветаНаВопросОЗаписиСПустымСпискомРолей", ЭтотОбъект, ПараметрыЗаписи),
				НСтр("ru = 'Пользователю информационной базы не установлено ни одной роли. Продолжить?'"),
				РежимДиалогаВопрос.ДаНет,
				,
				,
				НСтр("ru = 'Запись пользователя информационной базы'"));
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		
		Если ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля)
			И ПользовательИБАдресЭлектроннойПочты <> ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля] Тогда
			
			Если ПарольДляПодтвержденияИзмененияПочты = Неопределено Тогда
				
				Отказ = Истина;
				
				ДополнительныеПараметры = Новый Структура("ПараметрыЗаписи", ПараметрыЗаписи);
				Оповещение = Новый ОписаниеОповещения("ПослеЗапросаПароляДляИзмененияПочты", ЭтотОбъект, ДополнительныеПараметры);
				ОткрытьФорму("Справочник.Пользователи.Форма.ВводПароля",, ЭтотОбъект,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
				
				Возврат;
				
			КонецЕсли;
			
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
	ТекущийОбъект.ДополнительныеСвойства.Вставить("ЗначениеКопирования", ЗначениеКопирования);
	
	ОбновитьОтображаемыйТипПользователя();
	// Автообновление наименования внешнего пользователя.
	УстановитьПривилегированныйРежим(Истина);
	ТекущееПредставлениеОбъектаАвторизации = Строка(ТекущийОбъект.ОбъектАвторизации);
	УстановитьПривилегированныйРежим(Ложь);
	Объект.Наименование        = ТекущееПредставлениеОбъектаАвторизации;
	ТекущийОбъект.Наименование = ТекущееПредставлениеОбъектаАвторизации;
	
	Если ТребуетсяЗаписьПользователяИБ(ЭтотОбъект) Тогда
		
		Если ПользователиСлужебный.ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Тогда
			
			Если ПользовательИБЗапрещеноИзменятьПароль Тогда
				ПользовательИБЗапрещеноВосстанавливатьПароль = Истина;
			КонецЕсли;
			
			Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
				
				Если ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, Объект) Тогда
					
					Если ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля)
						И ПользовательИБАдресЭлектроннойПочты <> ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля] Тогда
						
						Если ЗначениеЗаполнено(ТекущийОбъект.Ссылка) Тогда
							Подготовлен = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийОбъект.Ссылка, "Подготовлен");
						Иначе
							Подготовлен = УровеньДоступа.УправлениеСписком;
						КонецЕсли;
						
						ИзменятьПочтуБезПодтвержденияПаролем = Пользователи.ЭтоПолноправныйПользователь() Или Подготовлен;
						
						Если Не ИзменятьПочтуБезПодтвержденияПаролем Тогда
							
							ПарольСовпадаетССохраненным = Ложь;
							
							Если ТипЗнч(ПарольДляПодтвержденияИзмененияПочты) = Тип("Строка") Тогда
								УстановитьПривилегированныйРежим(Истина);
								ПарольСовпадаетССохраненным = ПользователиСлужебный.СтарыйПарольСовпадаетССохраненным(
									ПарольДляПодтвержденияИзмененияПочты, Объект.ИдентификаторПользователяИБ);
								УстановитьПривилегированныйРежим(Ложь);
							КонецЕсли;
							
							// проверка пароля
							Если Не ПарольСовпадаетССохраненным Тогда
								ПарольДляПодтвержденияИзмененияПочты = Неопределено;
								ВызватьИсключение НСтр("ru = 'Пароль указан неверно'");
							КонецЕсли;
						КонецЕсли;
						
						ПользовательИБАдресЭлектроннойПочты = ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля];
						
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		ОписаниеПользователяИБ = ОписаниеПользователяИБ();
		
		Если ЗначениеЗаполнено(Объект.ИдентификаторПользователяИБ) Тогда
			ОписаниеПользователяИБ.Вставить("УникальныйИдентификатор", Объект.ИдентификаторПользователяИБ);
		КонецЕсли;
		ОписаниеПользователяИБ.Вставить("Действие", "Записать");
		
		ТекущийОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
	КонецЕсли;
	
	Если ДействияВФорме.СвойстваЭлемента <> "Редактирование" Тогда
		ЗаполнитьЗначенияСвойств(ТекущийОбъект, ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
			ТекущийОбъект.Ссылка, "ПометкаУдаления"));
	КонецЕсли;
	
	РегистрыСведений.СведенияОПользователях.УстановитьСведенияОПользователе(ЭтотОбъект, ТекущийОбъект);
	
	ТекущийОбъект.ДополнительныеСвойства.Вставить(
		"ГруппаНовогоВнешнегоПользователя", ГруппаНовогоВнешнегоПользователя);
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
	
	// СтандартныеПодсистемы.КонтактнаяИнформация
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		Если МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(Объект.ОбъектАвторизации) Тогда
			ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТипЗнч(Объект.ОбъектАвторизации));
			МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
			МодульУправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтотОбъект, ЭтотОбъект[ИмяРеквизитаОбъектАвторизации]);
		КонецЕсли;
	КонецЕсли;
	// Конец СтандартныеПодсистемы.КонтактнаяИнформация
	
КонецПроцедуры

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
	// СтандартныеПодсистемы.КонтактнаяИнформация
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация")
		 И Пользователи.ЭтоПолноправныйПользователь() Тогда
		
		ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТипЗнч(Объект.ОбъектАвторизации));
		
		ОбъектАвторизацииОбъект = РеквизитФормыВЗначение(ИмяРеквизитаОбъектАвторизации);
		Если Не ОбъектАвторизацииОбъект.Ссылка.Пустая() Тогда
			ОбъектАвторизацииОбъект.Записать();
			ЗначениеВРеквизитФормы(ОбъектАвторизацииОбъект, ИмяРеквизитаОбъектАвторизации);
		КонецЕсли;
	КонецЕсли;
	// Конец СтандартныеПодсистемы.КонтактнаяИнформация
	
	Если ПараметрыЗаписи.Свойство("КопироватьПраваПользователя") Тогда
		Источник = ЗначениеКопирования;
		Приемник = ТекущийОбъект.Ссылка;
		МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный");
		МодульУправлениеДоступомСлужебный.ПриКопированииПравНовомуПользователю(Источник, Приемник);
		ПользователиСлужебный.СкопироватьГруппыПользователя(Источник, Приемник);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
	
	Если ТребуетсяЗаписьПользователяИБ(ЭтотОбъект) Тогда
		ПараметрыЗаписи.Вставить(
			ТекущийОбъект.ДополнительныеСвойства.ОписаниеПользователяИБ.РезультатДействия);
	КонецЕсли;
	
	НастроитьФорму(ТекущийОбъект, , ПараметрыЗаписи);
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
		МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
		МодульУправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	
	Оповестить("Запись_ВнешниеПользователи", Новый Структура, Объект.Ссылка);
	ОповеститьОбИзменении(Объект.ОбъектАвторизации);
	
	Если ПараметрыЗаписи.Свойство("ДобавленПользовательИБ") Тогда
		Оповестить("ДобавленПользовательИБ", ПараметрыЗаписи.ДобавленПользовательИБ, ЭтотОбъект);
		
	ИначеЕсли ПараметрыЗаписи.Свойство("ИзмененПользовательИБ") Тогда
		Оповестить("ИзмененПользовательИБ", ПараметрыЗаписи.ИзмененПользовательИБ, ЭтотОбъект);
		
	ИначеЕсли ПараметрыЗаписи.Свойство("УдаленПользовательИБ") Тогда
		Оповестить("УдаленПользовательИБ", ПараметрыЗаписи.УдаленПользовательИБ, ЭтотОбъект);
		
	ИначеЕсли ПараметрыЗаписи.Свойство("ОчищеноСопоставлениеСНесуществующимПользователемИБ") Тогда
		
		Оповестить(
			"ОчищеноСопоставлениеСНесуществующимПользователемИБ",
			ПараметрыЗаписи.ОчищеноСопоставлениеСНесуществующимПользователемИБ, ЭтотОбъект);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ГруппаНовогоВнешнегоПользователя) Тогда
		ОповеститьОбИзменении(ГруппаНовогоВнешнегоПользователя);
		
		Оповестить(
			"Запись_ГруппыВнешнихПользователей",
			Новый Структура,
			ГруппаНовогоВнешнегоПользователя);
		
		ГруппаНовогоВнешнегоПользователя = Неопределено;
	КонецЕсли;
	
	ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект);
	
	Если ПараметрыЗаписи.Свойство("ЗаписатьИЗакрыть") Тогда
		ПодключитьОбработчикОжидания("ЗакрытьФорму", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	
	ТекстОшибки = "";
	Если ПользователиСлужебный.ОбъектАвторизацииИспользуется(
	         Объект.ОбъектАвторизации, Объект.Ссылка, , , ТекстОшибки) Тогда
		
		ОбщегоНазначения.СообщитьПользователю(
			ТекстОшибки, , "Объект.ОбъектАвторизации", , Отказ);
	КонецЕсли;
	
	Если ВходВПрограммуРазрешен
	   И ЗначениеЗаполнено(СрокДействия)
	   И СрокДействия <= НачалоДня(ТекущаяДатаСеанса()) Тогда
		
		ОбщегоНазначения.СообщитьПользователю(
			НСтр("ru = 'Ограничение должно быть до завтра или более.'"),, "ВходВПрограммуРазрешен",, Отказ);
	КонецЕсли;
	
	Если ТребуетсяЗаписьПользователяИБ(ЭтотОбъект) Тогда
		ОписаниеПользователяИБ = ОписаниеПользователяИБ();
		ОписаниеПользователяИБ.Вставить("ИдентификаторПользователяИБ", Объект.ИдентификаторПользователяИБ);
		ПользователиСлужебный.ПроверитьОписаниеПользователяИБ(ОписаниеПользователяИБ, Отказ, Истина);
		
		ТекстСообщения = "";
		Если ПользователиСлужебный.ТребуетсяСоздатьПервогоАдминистратора(Неопределено, ТекстСообщения) Тогда
			ОбщегоНазначения.СообщитьПользователю(
				ТекстСообщения, , "ВходВПрограммуРазрешен", , Отказ);
		КонецЕсли;
	КонецЕсли;
	
	// Проверка наличия ролей в метаданных.
	Если Не Элементы.Роли.ТолькоПросмотр Тогда
		Ошибки = Неопределено;
		ЭлементыДерева = Роли.ПолучитьЭлементы();
		Для Каждого Строка Из ЭлементыДерева Цикл
			Если Не Строка.Пометка Тогда
				Продолжить;
			КонецЕсли;
			Если Строка.ЭтоНесуществующаяРоль Тогда
				ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки,
					"Роли[%1].РолиСиноним",
					СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Несуществующая роль ""%1"".'"), Строка.Синоним),
					"Роли",
					ЭлементыДерева.Индекс(Строка),
					СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Несуществующая роль ""%1"" в строке %2.'"), Строка.Синоним, "%1"));
			КонецЕсли;
			Если Строка.ЭтоНедоступнаяРоль Тогда
				ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки,
					"Роли[%1].РолиСиноним",
					СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Роль ""%1"" недоступна для внешних пользователей.'"), Строка.Синоним),
					"Роли",
					ЭлементыДерева.Индекс(Строка),
					СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Роль ""%1"" в строке %2 недоступна для внешних пользователей.'"), Строка.Синоним, "%1"));
			КонецЕсли;
		КонецЦикла;
		ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки, Отказ);
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
	КонецЕсли;
	
	// СтандартныеПодсистемы.КонтактнаяИнформация
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		Если МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(Объект.ОбъектАвторизации) Тогда
			ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТипЗнч(Объект.ОбъектАвторизации));
			ОбъектАвторизацииОбъект = РеквизитФормыВЗначение(ИмяРеквизитаОбъектАвторизации);
			МодульУправлениеКонтактнойИнформацией.ОбработкаПроверкиЗаполненияНаСервере(ЭтотОбъект, ОбъектАвторизацииОбъект, Отказ);
		КонецЕсли;
	КонецЕсли;
	// Конец СтандартныеПодсистемы.КонтактнаяИнформация
	
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	
	ОбработатьИнтерфейсРолей("НастроитьИнтерфейсРолейПриЗагрузкеНастроек", Настройки);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ОбъектАвторизацииПриИзменении(Элемент)
	
	ОбъектАвторизацииПриИзмененииНаКлиентеНаСервере(ЭтотОбъект, Объект);
	ИзменитьРеквизитОбъектАвторизации();
	
КонецПроцедуры

&НаКлиенте
Процедура НедействителенПриИзменении(Элемент)
	
	Если Объект.Недействителен Тогда
		ВходВПрограммуРазрешен = Ложь;
		Если Не ПользовательИБАутентификацияOpenID
		   И Не ПользовательИБАутентификацияOpenIDConnect
		   И Не ПользовательИБАутентификацияТокеномДоступа
		   И Не ПользовательИБАутентификацияСтандартнаяЗначениеПрямогоИзменения
		   И ПользовательИБАутентификацияСтандартная Тогда
			
			ПользовательИБАутентификацияСтандартная = Ложь;
		КонецЕсли;
	ИначеЕсли ВходВПрограммуРазрешенЗначениеПрямогоИзменения Тогда
		Если Не ПользовательИБАутентификацияСтандартная
		   И Не ПользовательИБАутентификацияOpenID
		   И Не ПользовательИБАутентификацияOpenIDConnect
		   И Не ПользовательИБАутентификацияТокеномДоступа Тогда
			ПользовательИБАутентификацияСтандартная = Истина;
		КонецЕсли;
		ВходВПрограммуРазрешен = Истина;
	КонецЕсли;
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ВходВПрограммуРазрешенПриИзменении(Элемент)
	
	Если Объект.ПометкаУдаления И ВходВПрограммуРазрешен Тогда
		ВходВПрограммуРазрешен = Ложь;
		ПоказатьПредупреждение(,
			НСтр("ru = 'Чтобы разрешить вход в программу, снимите
			           |пометку на удаление с этого внешнего пользователя.'"));
		Возврат;
	КонецЕсли;
	
	Если Не ВходВПрограммуРазрешен
	   И Не ПользовательИБАутентификацияOpenID
	   И Не ПользовательИБАутентификацияOpenIDConnect
	   И Не ПользовательИБАутентификацияТокеномДоступа
	   И Не ПользовательИБАутентификацияСтандартнаяЗначениеПрямогоИзменения
	   И ПользовательИБАутентификацияСтандартная Тогда
		
		ПользовательИБАутентификацияСтандартная = Ложь;
	КонецЕсли;
	
	ОбновитьИмяДляВхода(ЭтотОбъект);
	
	Если ВходВПрограммуРазрешен
	   И Не ПользовательИБАутентификацияOpenID
	   И Не ПользовательИБАутентификацияOpenIDConnect
	   И Не ПользовательИБАутентификацияТокеномДоступа
	   И Не ПользовательИБАутентификацияСтандартная Тогда
	
		ПользовательИБАутентификацияСтандартная = Истина;
	КонецЕсли;
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
	Если Не УровеньДоступа.ИзменениеРазрешенияНаВход
	   И Не ВходВПрограммуРазрешен Тогда
		
		ПоказатьПредупреждение(,
			НСтр("ru = 'После записи вход в программу сможет разрешить только администратор.'"));
	КонецЕсли;
	
	ВходВПрограммуРазрешенЗначениеПрямогоИзменения = ВходВПрограммуРазрешен;
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьОграничениеНаВходВПрограмму(Команда)
	
	ОткрытьФорму("Справочник.Пользователи.Форма.ОграничениеНаВходВПрограмму",, ЭтотОбъект,,,,
		Новый ОписаниеОповещения("ИзменитьОграничениеНаВходВПрограммуЗавершение", ЭтотОбъект));
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБИмяПриИзменении(Элемент)
	
	ПользовательИБИмя = СокрЛП(ПользовательИБИмя);
	ПользовательИБИмяЗначениеПрямогоИзменения = ПользовательИБИмя;
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБАутентификацияСтандартнаяПриИзменении(Элемент)
	
	АутентификацияПриИзменении();
	ПользовательИБАутентификацияСтандартнаяЗначениеПрямогоИзменения = ПользовательИБАутентификацияСтандартная;
	
КонецПроцедуры

&НаКлиенте
Процедура ПотребоватьСменуПароляПриВходеПриИзменении(Элемент)
	
	Если ПотребоватьСменуПароляПриВходе Тогда
		ПользовательИБЗапрещеноИзменятьПароль = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБЗапрещеноИзменятьПарольПриИзменении(Элемент)
	
	Если ПользовательИБЗапрещеноИзменятьПароль Тогда
		ПотребоватьСменуПароляПриВходе = Ложь;
		ПользовательИБЗапрещеноВосстанавливатьПароль = Истина;
	КонецЕсли;
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБАутентификацияOpenIDПриИзменении(Элемент)
	
	АутентификацияПриИзменении();
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБАутентификацияOpenIDConnectПриИзменении(Элемент)
	
	АутентификацияПриИзменении();
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБАутентификацияТокеномДоступаПриИзменении(Элемент)
	
	АутентификацияПриИзменении();
	
КонецПроцедуры

&НаКлиенте
Процедура ПользовательИБЯзыкПриИзменении(Элемент)
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьРолиНепосредственноПриИзменении(Элемент)
	
	Если Не Объект.УстановитьРолиНепосредственно Тогда
		ПрочитатьРолиПользователяИБ();
		ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект);
	КонецЕсли;
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	ОбработатьИнтерфейсРолейУстановитьТолькоПросмотрРолей();
	
КонецПроцедуры

&НаКлиенте
Процедура СтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства")
		И ТекущаяСтраница.Имя = "СтраницаДополнительныеРеквизиты"
		И Не ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда
		
		СвойстваВыполнитьОтложеннуюИнициализацию();
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПотребоватьСменуПароляПриВходеРасширеннаяПодсказкаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ПоказатьНастройкиВнешнихПользователей", Истина);
	
	ОткрытьФорму("ОбщаяФорма.НастройкиВходаПользователей", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры

// СтандартныеПодсистемы.КонтактнаяИнформация

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияПриИзменении(Элемент)
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьИзменение(ЭтотОбъект, Элемент);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьВыбор(ЭтотОбъект, Элемент, , СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияПриНажатии(Элемент, СтандартнаяОбработка)
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьВыбор(ЭтотОбъект, Элемент, , СтандартнаяОбработка);
КонецПроцедуры

// Параметры:
//  Элемент - ПолеФормы
//  СтандартнаяОбработка - Булево
//
&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияОчистка(Элемент, СтандартнаяОбработка)
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьОчистку(ЭтотОбъект, Элемент.Имя);
КонецПроцедуры

// Параметры:
//  Команда - КомандаФормы
//
&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияВыполнитьКоманду(Команда)
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда.Имя);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.АвтоПодборАдреса(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка);
	
КонецПроцедуры

// Параметры:
//  Элемент - ПолеФормы
//  ВыбранноеЗначение - Произвольный
//  СтандартнаяОбработка -Булево
//
&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.ОбработкаВыбора(ЭтотОбъект, ВыбранноеЗначение, Элемент.Имя, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	МодульУправлениеКонтактнойИнформациейКлиент =
		ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
	МодульУправлениеКонтактнойИнформациейКлиент.НачатьОбработкуНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПродолжитьОбновлениеКонтактнойИнформации(Результат, ДополнительныеПараметры) Экспорт
	ОбновитьКонтактнуюИнформацию(Результат);
КонецПроцедуры

&НаСервере
Процедура ОбновитьКонтактнуюИнформацию(Результат)
	МодульУправлениеКонтактнойИнформацией =
		ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
	МодульУправлениеКонтактнойИнформацией.ОбновитьКонтактнуюИнформацию(ЭтотОбъект, Объект, Результат);
КонецПроцедуры

// Конец СтандартныеПодсистемы.КонтактнаяИнформация

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыРоли

////////////////////////////////////////////////////////////////////////////////
// Для работы интерфейса ролей.

&НаКлиенте
Процедура РолиПометкаПриИзменении(Элемент)
	
	Если Элементы.Роли.ТекущиеДанные <> Неопределено Тогда
		ОбработатьИнтерфейсРолей("ОбновитьСоставРолей");
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Поддержка дополнительных реквизитов.

&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ЗаписатьИЗакрыть(Команда)
	
	Записать(Новый Структура("ЗаписатьИЗакрыть"));
	
КонецПроцедуры

&НаКлиенте
Процедура СменитьПароль(Команда)
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ВернутьПарольБезУстановки", Истина);
	ДополнительныеПараметры.Вставить("СтарыйПароль", ПользовательИБСтарыйПароль);
	ДополнительныеПараметры.Вставить("ИмяДляВхода",  ПользовательИБИмя);
	
	ПользователиСлужебныйКлиент.ОткрытьФормуСменыПароля(Объект.Ссылка, Новый ОписаниеОповещения(
		"СменитьПарольПослеПолученияПароля", ЭтотОбъект), ДополнительныеПараметры);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Для работы интерфейса ролей.

&НаКлиенте
Процедура ПоказатьТолькоВыбранныеРоли(Команда)
	
	ОбработатьИнтерфейсРолей("ТолькоВыбранныеРоли");
	ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ГруппировкаРолейПоПодсистемам(Команда)
	
	ОбработатьИнтерфейсРолей("ГруппировкаПоПодсистемам");
	ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ВключитьРоли(Команда)
	
	ОбработатьИнтерфейсРолей("ОбновитьСоставРолей", "ВключитьВсе");
	
	ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект, Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ИсключитьРоли(Команда)
	
	ОбработатьИнтерфейсРолей("ОбновитьСоставРолей", "ИсключитьВсе");
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура СоздатьРеквизитОбъектАвторизации()
	
	ЗначениеОбъектаАвторизации = ОбъектАвторизации("ОбъектАвторизации");
	
	Если ЗначениеОбъектаАвторизации = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекущийТипОбъектАвторизации = ТипЗнч(ЗначениеОбъектаАвторизации);
	
	ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТекущийТипОбъектАвторизации);
	
	ОписаниеТипаНаФорме = Неопределено;
	РеквизитыФормы = ПолучитьРеквизиты();
	Для каждого РеквизитФормы Из РеквизитыФормы Цикл
		Если РеквизитФормы.Имя = ИмяРеквизитаОбъектАвторизации Тогда
			ОписаниеТипаНаФорме = РеквизитФормы.ТипЗначения.Типы()[0];
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Если ТекущийТипОбъектАвторизации <> ОписаниеТипаНаФорме Тогда
		
		ДобавляемыеРеквизиты = Новый Массив;
		
		МассивТипов = Новый Массив;
		МассивТипов.Добавить(ТекущийТипОбъектАвторизации);
		
		ОписаниеТипа = Новый ОписаниеТипов(МассивТипов);
		ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизитаОбъектАвторизации, ОписаниеТипа));
		ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	КонецЕсли;
	
	ЗначениеВРеквизитФормы(ЗначениеОбъектаАвторизации, ИмяРеквизитаОбъектАвторизации);
	
КонецПроцедуры

&НаСервере
Функция ОбъектАвторизации(ИмяРеквизитаОбъектАвторизации)
	
	Если ТипЗнч(Объект[ИмяРеквизитаОбъектАвторизации])= Тип("Строка")
		Или Не ЗначениеЗаполнено(Объект[ИмяРеквизитаОбъектАвторизации]) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ЗначениеОбъектаАвторизации = Объект[ИмяРеквизитаОбъектАвторизации].ПолучитьОбъект();
	
	Возврат ЗначениеОбъектаАвторизации;
	
КонецФункции

&НаСервереБезКонтекста
Функция ИмяРеквизитаОбъектАвторизации(ТипОбъектАвторизации)
	Префикс = Метаданные.НайтиПоТипу(ТипОбъектАвторизации).Имя;
	Возврат "ОбъектАвторизацииВнешнегоПользователя" + Префикс;
КонецФункции

&НаСервере
Процедура ИзменитьРеквизитОбъектАвторизации()
	
	// СтандартныеПодсистемы.КонтактнаяИнформация
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		СоздатьРеквизитОбъектАвторизации();
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		
		Если Не ЗначениеЗаполнено(Объект.ОбъектАвторизации) 
			Или Не МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(Объект.ОбъектАвторизации) Тогда
				Возврат;
		КонецЕсли;
		
		ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТипЗнч(Объект.ОбъектАвторизации));
		
		Если Элементы.ГруппаКонтактнаяИнформация.ПодчиненныеЭлементы.Количество() = 0 Тогда
			
			Если МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(Объект.ОбъектАвторизации) Тогда
				МодульУправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, ЭтотОбъект[ИмяРеквизитаОбъектАвторизации]);
			КонецЕсли;
			
		Иначе
			
			МодульУправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтотОбъект, ЭтотОбъект[ИмяРеквизитаОбъектАвторизации]);
			
		КонецЕсли;
		
		ПарольДляПодтвержденияИзмененияПочты  = Неопределено;
		Если Пользователи.ЭтоПолноправныйПользователь() Тогда
			
			Если Не ПользователиСлужебный.ИнтерактивноЗапрашиватьВводПароля(УровеньДоступа, Объект) Тогда
				ПарольДляПодтвержденияИзмененияПочты = "";
			КонецЕсли;
			
			ИмяРеквизитаСПочтойДляВосстановленияПароля = МодульУправлениеКонтактнойИнформацией.ОпределитьЭлементСПочтойДляВосстановленияПароля(
			ЭтотОбъект, 
			ПользовательИБАдресЭлектроннойПочты,
			ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, Объект),
			Истина);
			
			Элементы.ГруппаКонтактнаяИнформация.Доступность = Истина;
			
		Иначе
			
			Элементы.ГруппаКонтактнаяИнформация.Доступность = Ложь;
			
		КонецЕсли;
			
		
	КонецЕсли;
	// Конец СтандартныеПодсистемы.КонтактнаяИнформация
	
КонецПроцедуры

&НаСервере
Процедура ОбработатьИнтерфейсРолейУстановитьТолькоПросмотрРолей(ТекущийОбъект = Неопределено)
	
	Если ТекущийОбъект = Неопределено Тогда
		ТекущийОбъект = Объект;
	КонецЕсли;
	
	ОбработатьИнтерфейсРолей("УстановитьТолькоПросмотрРолей",
		    ЗапретРедактированияРолей
		Или ДействияВФорме.Роли <> "Редактирование"
		Или Не УровеньДоступа.НастройкиДляВхода
		Или Не ТекущийОбъект.УстановитьРолиНепосредственно);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененияГруппыДоступа()
	
	ПриИзмененияГруппыДоступаНаСервере();
	
КонецПроцедуры

&НаСервере
Процедура ПриИзмененияГруппыДоступаНаСервере()
	
	УстановитьПривилегированныйРежим(Истина);
	НаличиеПрав = РегистрыСведений.СведенияОПользователях.НаличиеПрав(Объект.ИдентификаторПользователяИБ);
	УстановитьПривилегированныйРежим(Ложь);
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаСервере
Процедура НастроитьФорму(ТекущийОбъект, ПриСозданииНаСервере = Ложь, ПараметрыЗаписи = Неопределено)
	
	СоздатьРеквизитОбъектАвторизации();
	
	Если НачальноеОписаниеПользователяИБ = Неопределено Тогда
		Возврат; // Вызов ПриЧтенииНаСервере до вызова ПриСозданииНаСервере.
	КонецЕсли;
	
	Если Не ПриСозданииНаСервере Тогда
		ПрочитатьПользователяИБ();
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	РегистрыСведений.СведенияОПользователях.ПрочитатьСведенияОПользователе(ЭтотОбъект);
	НаличиеПрав = РегистрыСведений.СведенияОПользователях.НаличиеПрав(Объект.ИдентификаторПользователяИБ);
	УстановитьПривилегированныйРежим(Ложь);
	
	УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(ТекущийОбъект);
	
	ОпределитьДействияВФорме();
	
	ОпределитьНесоответствияПользователяСПользователемИБ(ПараметрыЗаписи);
	
	ОбработатьИнтерфейсРолейУстановитьТолькоПросмотрРолей(ТекущийОбъект);
	
	// Установка постоянной доступности свойств.
	Элементы.СвойстваПользователяИБ.Видимость =
		ЗначениеЗаполнено(ДействияВФорме.СвойстваПользователяИБ);
	
	Элементы.ГруппаИмя.Видимость =
		ЗначениеЗаполнено(ДействияВФорме.СвойстваПользователяИБ);
	
	Элементы.ОтображениеРолей.Видимость =
		ЗначениеЗаполнено(ДействияВФорме.Роли);
	
	Элементы.УстановитьРолиНепосредственно.Видимость =
		ЗначениеЗаполнено(ДействияВФорме.Роли) И НЕ ПользователиСлужебный.ЗапретРедактированияРолей();
	
	ОбновитьОтображаемыйТипПользователя();
	
	ТолькоПросмотр = ТолькоПросмотр
		ИЛИ ДействияВФорме.Роли                   <> "Редактирование"
		  И ДействияВФорме.СвойстваЭлемента       <> "Редактирование"
		  И ДействияВФорме.СвойстваПользователяИБ <> "Редактирование";
	
	
	ДоступностьКнопки = Не ТолькоПросмотр И ПравоДоступа("Редактирование",
		Метаданные.Справочники.ВнешниеПользователи);
	
	Если Элементы.ФормаЗаписатьИЗакрыть.Доступность <> ДоступностьКнопки Тогда
		Элементы.ФормаЗаписатьИЗакрыть.Доступность = ДоступностьКнопки;
	КонецЕсли;
	
	Если Элементы.ИзменитьОграничениеНаВходВПрограмму.Доступность <> ДоступностьКнопки Тогда
		Элементы.ИзменитьОграничениеНаВходВПрограмму.Доступность = ДоступностьКнопки;
	КонецЕсли;
	
	Если Элементы.СменитьПароль.Доступность <> ДоступностьКнопки Тогда
		Элементы.СменитьПароль.Доступность = ДоступностьКнопки;
	КонецЕсли;
	
	Элементы.РекомендуетсяПроверитьНастройкиДляВхода.Видимость =
		  УровеньДоступа.ИзменениеРазрешенияНаВход
		И ТекущийОбъект.Подготовлен
		И Не ПриЧтенииВходВПрограммуРазрешен;
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьИмяДляВхода(Форма, ПриИзмененииНаименования = Ложь)
	
	Элементы = Форма.Элементы;
	
	// Настройка необходимости заполнения.
	ПоказатьИмяСОтметкойНезаполненного = ТребуетсяЗаписьПользователяИБ(Форма, Ложь);
	Элементы.ПользовательИБИмя.АвтоОтметкаНезаполненного = ПоказатьИмяСОтметкойНезаполненного;
	Если Не ПоказатьИмяСОтметкойНезаполненного Тогда
		Элементы.ПользовательИБИмя.ОтметкаНезаполненного = Ложь;
	КонецЕсли;
	
	Если Форма.ПользовательИБСуществует Тогда
		Возврат;
	КонецЕсли;
	
	КраткоеИмя = ПользователиСлужебныйКлиентСервер.ПолучитьКраткоеИмяПользователяИБ(
		Форма.ТекущееПредставлениеОбъектаАвторизации);
	
	Если Не ПоказатьИмяСОтметкойНезаполненного Тогда
		
		Если (Не ЗначениеЗаполнено(Форма.ПользовательИБИмяЗначениеПрямогоИзменения)
		      Или Форма.ПользовательИБИмяЗначениеПрямогоИзменения = КраткоеИмя)
		   И Форма.ПользовательИБИмя = КраткоеИмя Тогда
		
			Форма.ПользовательИБИмя = "";
		КонецЕсли;
	Иначе
		Если ПриИзмененииНаименования
		 Или Не ЗначениеЗаполнено(Форма.ПользовательИБИмя) Тогда
			
			Форма.ПользовательИБИмя = КраткоеИмя;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура АутентификацияПриИзменении()
	
	Если Не ПользовательИБАутентификацияСтандартная
	   И Не ПользовательИБАутентификацияOpenID
	   И Не ПользовательИБАутентификацияOpenIDConnect
	   И Не ПользовательИБАутентификацияТокеномДоступа Тогда
	
		ВходВПрограммуРазрешен = Ложь;
		
	ИначеЕсли Не ВходВПрограммуРазрешен Тогда
		ВходВПрограммуРазрешен = ВходВПрограммуРазрешенЗначениеПрямогоИзменения;
	КонецЕсли;
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

// Продолжение процедуры СменитьПароль.
&НаКлиенте
Процедура СменитьПарольПослеПолученияПароля(Результат, Контекст) Экспорт
	
	Если Не ЗначениеЗаполнено(Результат) Тогда
		Возврат;
	КонецЕсли;
	
	Модифицированность = Истина;
	
	ПользовательИБПароль       = Результат.НовыйПароль;
	ПользовательИБСтарыйПароль = Результат.СтарыйПароль;
	
	УстановитьНаличиеПароля(ЭтотОбъект, ЗначениеЗаполнено(ПользовательИБПароль),
		ПользователиКлиент.АвторизованныйПользователь());
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьНаличиеПароля(Форма, ПарольУстановлен, АвторизованныйПользователь)
	
	ПользователиСлужебныйКлиентСервер.УстановитьНаличиеПароля(Форма, ПарольУстановлен, АвторизованныйПользователь);
	
КонецПроцедуры

&НаСервере
Процедура ОпределитьДействияВФорме()
	
	ДействияВФорме = Новый Структура;
	
	// "", "Просмотр", "Редактирование".
	ДействияВФорме.Вставить("Роли", "");
	
	// "", "Просмотр", "Редактирование".
	ДействияВФорме.Вставить("СвойстваПользователяИБ", "");
	
	// "", "Просмотр", "Редактирование".
	ДействияВФорме.Вставить("СвойстваЭлемента", "Просмотр");
	
	Если УровеньДоступа.ИзменениеТекущего Или УровеньДоступа.УправлениеСписком Тогда
		ДействияВФорме.СвойстваПользователяИБ = "Редактирование";
	КонецЕсли;
	
	Если УровеньДоступа.УправлениеСписком Тогда
		ДействияВФорме.СвойстваЭлемента = "Редактирование";
	КонецЕсли;
	
	Если УровеньДоступа.ПолныеПрава Тогда
		ДействияВФорме.Роли = "Редактирование";
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(Объект.Ссылка)
	   И НЕ ЗначениеЗаполнено(Объект.ОбъектАвторизации) Тогда
		
		ДействияВФорме.СвойстваЭлемента = "Редактирование";
	КонецЕсли;
	
	ПользователиСлужебный.ПриОпределенииДействийВФорме(Объект.Ссылка, ДействияВФорме);
	
	// Проверка имен действий в форме.
	Если СтрНайти(", Просмотр, Редактирование,", ", " + ДействияВФорме.Роли + ",") = 0 Тогда
		ДействияВФорме.Роли = "";
		
	ИначеЕсли ДействияВФорме.Роли = "Редактирование"
	        И ПользователиСлужебный.ЗапретРедактированияРолей() Тогда
		
		ДействияВФорме.Роли = "Просмотр";
	КонецЕсли;
	
	Если СтрНайти(", Просмотр, ПросмотрВсех, Редактирование, РедактированиеСвоих, РедактированиеВсех,",
	           ", " + ДействияВФорме.СвойстваПользователяИБ + ",") = 0 Тогда
		
		ДействияВФорме.СвойстваПользователяИБ = "";
		
	Иначе // Поддержка обратной совместимости.
		Если СтрНайти(ДействияВФорме.СвойстваПользователяИБ, "Просмотр") Тогда
			ДействияВФорме.СвойстваПользователяИБ = "Просмотр";
			
		ИначеЕсли СтрНайти(ДействияВФорме.СвойстваПользователяИБ, "Редактирование") Тогда
			ДействияВФорме.СвойстваПользователяИБ = "Редактирование";
		КонецЕсли;
	КонецЕсли;
	
	Если СтрНайти(", Просмотр, Редактирование,", ", " + ДействияВФорме.СвойстваЭлемента + ",") = 0 Тогда
		ДействияВФорме.СвойстваЭлемента = "";
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ОписаниеПользователяИБ()
	
	Если УровеньДоступа.УправлениеСписком
	   И ДействияВФорме.СвойстваЭлемента = "Редактирование" Тогда
		
		ПользовательИБПолноеИмя = Объект.Наименование;
	КонецЕсли;
	
	Если УровеньДоступа.АдминистраторСистемы
	 Или УровеньДоступа.ПолныеПрава Тогда
		
		Результат = Пользователи.НовоеОписаниеПользователяИБ();
		Пользователи.СкопироватьСвойстваПользователяИБ(
			Результат,
			ЭтотОбъект,
			,
			"УникальныйИдентификатор,
			|Роли",
			"ПользовательИБ");
		
		Результат.Вставить("ВходВПрограммуРазрешен", ВходВПрограммуРазрешен);
		
	Иначе
		Результат = Новый Структура;
		
		Если УровеньДоступа.ИзменениеТекущего Тогда
			Результат.Вставить("Пароль", ПользовательИБПароль);
			Результат.Вставить("Язык",   ПользовательИБЯзык);
		КонецЕсли;
		
		Если УровеньДоступа.УправлениеСписком Тогда
			Результат.Вставить("ВходВПрограммуРазрешен",  ВходВПрограммуРазрешен);
			Результат.Вставить("ЗапрещеноИзменятьПароль", ПользовательИБЗапрещеноИзменятьПароль);
			Результат.Вставить("Язык",                    ПользовательИБЯзык);
			Результат.Вставить("ПолноеИмя",               ПользовательИБПолноеИмя);
		КонецЕсли;
		
		Если УровеньДоступа.НастройкиДляВхода Тогда
			Результат.Вставить("АутентификацияСтандартная",    ПользовательИБАутентификацияСтандартная);
			Результат.Вставить("Пароль",                       ПользовательИБПароль);
			Результат.Вставить("Имя",                          ПользовательИБИмя);
			Результат.Вставить("АутентификацияOpenID",         ПользовательИБАутентификацияOpenID);
			Результат.Вставить("АутентификацияOpenIDConnect",  ПользовательИБАутентификацияOpenIDConnect);
			Результат.Вставить("АутентификацияТокеномДоступа", ПользовательИБАутентификацияТокеномДоступа);
		КонецЕсли;
	КонецЕсли;
	
	Если УровеньДоступа.НастройкиДляВхода
	   И Не ПользователиСлужебный.ЗапретРедактированияРолей()
	   И Объект.УстановитьРолиНепосредственно Тогда
		
		ТекущиеРоли = ПользовательИБРоли.Выгрузить(, "Роль").ВыгрузитьКолонку("Роль");
		Результат.Вставить("Роли", ТекущиеРоли);
	КонецЕсли;
	
	Если УровеньДоступа.УправлениеСписком Тогда
		Результат.Вставить("ПоказыватьВСпискеВыбора", Ложь);
		Результат.Вставить("РежимЗапуска", "Авто");
	КонецЕсли;
	
	Если УровеньДоступа.ПолныеПрава Тогда
		Результат.Вставить("АутентификацияОС", Ложь);
		Результат.Вставить("ПользовательОС", "");
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура ОбъектАвторизацииПриИзмененииНаКлиентеНаСервере(Форма, Объект)
	
	Если Объект.ОбъектАвторизации = Неопределено Тогда
		Объект.ОбъектАвторизации = Форма.ТипОбъектовАвторизации;
	КонецЕсли;
	
	Если Форма.ТекущееПредставлениеОбъектаАвторизации <> Строка(Объект.ОбъектАвторизации) Тогда
		Форма.ТекущееПредставлениеОбъектаАвторизации = Строка(Объект.ОбъектАвторизации);
		ОбновитьИмяДляВхода(Форма, Истина);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьОтображаемыйТипПользователя()
	
	Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Объект.ОбъектАвторизации)) Тогда
		Элементы.ОбъектАвторизации.Заголовок = Метаданные.НайтиПоТипу(ТипЗнч(Объект.ОбъектАвторизации)).ПредставлениеОбъекта;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеОтветаНаВопросОЗаписиСПустымСпискомРолей(Ответ, ПараметрыЗаписи) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Да Тогда
		ПараметрыЗаписи.Вставить("СПустымСпискомРолей");
		Записать(ПараметрыЗаписи);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеОтветаНаВопросОКопированииПрав(Ответ, ПараметрыЗаписи) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Да Тогда
		ПараметрыЗаписи.Вставить("КопироватьПраваПользователя");
	Иначе
		ПараметрыЗаписи.Вставить("НеКопироватьПраваПользователя");
	КонецЕсли;
	Записать(ПараметрыЗаписи);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗакрытьФорму()
	
	Закрыть();
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Поддержка дополнительных реквизитов.

&НаСервере
Процедура СвойстваВыполнитьОтложеннуюИнициализацию()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

// Продолжение обработчика события ПередЗаписью.
&НаКлиенте
Процедура ПослеЗапросаПароляДляИзмененияПочты(Результат, ДополнительныеПараметры) Экспорт
	
	Если ТипЗнч(Результат) = Тип("Строка") Тогда
		ПарольДляПодтвержденияИзмененияПочты = Результат;
		Записать(ДополнительныеПараметры.ПараметрыЗаписи);
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Обработка пользователя ИБ

&НаСервере
Процедура ПрочитатьРолиПользователяИБ()
	
	СвойстваПользователяИБ = Пользователи.СвойстваПользователяИБ(Объект.ИдентификаторПользователяИБ);
	Если СвойстваПользователяИБ = Неопределено Тогда
		СвойстваПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
	КонецЕсли;	
	ОбработатьИнтерфейсРолей("ЗаполнитьРоли", СвойстваПользователяИБ.Роли);
	
КонецПроцедуры

&НаСервере
Функция НачальноеОписаниеПользователяИБ()
	
	Если НачальноеОписаниеПользователяИБ <> Неопределено Тогда
		НачальноеОписаниеПользователяИБ.Роли = Новый Массив;
		Возврат НачальноеОписаниеПользователяИБ;
	КонецЕсли;
	
	ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
	ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь;
	ОписаниеПользователяИБ.Роли = Новый Массив;
	
	Возврат ОписаниеПользователяИБ;
	
КонецФункции

&НаСервере
Процедура ПрочитатьПользователяИБ(ПриКопированииЭлемента = Ложь)
	
	УстановитьПривилегированныйРежим(Истина);
	
	ОписаниеПользователяИБ   = НачальноеОписаниеПользователяИБ();
	ПользовательИБСуществует = Ложь;
	ПользовательИБОсновной   = Ложь;
	ВходВПрограммуРазрешен   = Ложь;
	ВходВПрограммуРазрешенЗначениеПрямогоИзменения = Ложь;
	
	Если ПриКопированииЭлемента Тогда
		
		ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Параметры.ЗначениеКопирования.ИдентификаторПользователяИБ);
		Если ПрочитанныеСвойства <> Неопределено Тогда
			
			// Сопоставление пользователя ИБ с пользователем в справочнике.
			Если Пользователи.ВходВПрограммуРазрешен(ПрочитанныеСвойства) Тогда
				ВходВПрограммуРазрешен = Истина;
				ВходВПрограммуРазрешенЗначениеПрямогоИзменения = Истина;
				ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
			КонецЕсли;
			
			// Копирование свойств и ролей пользователяИБ.
			ЗаполнитьЗначенияСвойств(
				ОписаниеПользователяИБ,
				ПрочитанныеСвойства,
				"ЗапрещеноИзменятьПароль,
				|ОсновнойИнтерфейс,
				|РежимЗапуска" + ?(Не Элементы.ПользовательИБЯзык.Видимость, "", ",
				|Язык") + ?(ПользователиСлужебный.ЗапретРедактированияРолей(), "", ",
				|Роли"));
		КонецЕсли;
		Объект.ИдентификаторПользователяИБ = Неопределено;
		УстановитьНаличиеПароля(ЭтотОбъект, Ложь, Пользователи.АвторизованныйПользователь());
	Иначе
		ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Объект.ИдентификаторПользователяИБ);
		Если ПрочитанныеСвойства <> Неопределено Тогда
		
			ПользовательИБСуществует = Истина;
			ПользовательИБОсновной = Истина;
			
		ИначеЕсли Параметры.Свойство("ИдентификаторПользователяИБ")
		        И ЗначениеЗаполнено(Параметры.ИдентификаторПользователяИБ) Тогда
			
			Если Объект.ИдентификаторПользователяИБ <> Параметры.ИдентификаторПользователяИБ Тогда
				Объект.ИдентификаторПользователяИБ = Параметры.ИдентификаторПользователяИБ;
				Модифицированность = Истина;
			КонецЕсли;
			ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Объект.ИдентификаторПользователяИБ);
			Если ПрочитанныеСвойства <> Неопределено Тогда
				
				ПользовательИБСуществует = Истина;
				Если Объект.Наименование <> ПрочитанныеСвойства.ПолноеИмя Тогда
					ПрочитанныеСвойства.ПолноеИмя = Объект.Наименование;
					Модифицированность = Истина;
				КонецЕсли;
				Если ПрочитанныеСвойства.АутентификацияОС Тогда
					ПрочитанныеСвойства.АутентификацияОС = Ложь;
					Модифицированность = Истина;
				КонецЕсли;
				Если ЗначениеЗаполнено(ПрочитанныеСвойства.ПользовательОС) Тогда
					ПрочитанныеСвойства.ПользовательОС = "";
					Модифицированность = Истина;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		Если ПользовательИБСуществует Тогда
			
			Если Не Элементы.ПользовательИБЯзык.Видимость Тогда
				ПрочитанныеСвойства.Язык = ОписаниеПользователяИБ.Язык;
			КонецЕсли;
			
			Если Пользователи.ВходВПрограммуРазрешен(ПрочитанныеСвойства) Тогда
				ВходВПрограммуРазрешен = Истина;
				ВходВПрограммуРазрешенЗначениеПрямогоИзменения = Истина;
			КонецЕсли;
			
			ЗаполнитьЗначенияСвойств(
				ОписаниеПользователяИБ,
				ПрочитанныеСвойства,
				"Имя,
				|ПолноеИмя,
				|АдресЭлектроннойПочты,
				|АутентификацияСтандартная,
				|ПоказыватьВСпискеВыбора,
				|ЗапрещеноИзменятьПароль,
				|ЗапрещеноВосстанавливатьПароль,
				|АутентификацияOpenID,
				|АутентификацияOpenIDConnect,
				|АутентификацияТокеномДоступа,
				|АутентификацияОС,
				|ПользовательОС,
				|ОсновнойИнтерфейс,
				|РежимЗапуска" + ?(Не Элементы.ПользовательИБЯзык.Видимость, "", ",
				|Язык") + ?(ПользователиСлужебный.ЗапретРедактированияРолей(), "", ",
				|Роли") + ",
				|ЗащитаОтОпасныхДействий");
		КонецЕсли;
		
		Если ПрочитанныеСвойства = Неопределено Тогда
			УстановитьНаличиеПароля(ЭтотОбъект, Ложь,
				Пользователи.АвторизованныйПользователь());
		Иначе
			УстановитьНаличиеПароля(ЭтотОбъект, ПрочитанныеСвойства.ПарольУстановлен,
				Пользователи.АвторизованныйПользователь());
		КонецЕсли;
	КонецЕсли;
	
	Пользователи.СкопироватьСвойстваПользователяИБ(
		ЭтотОбъект,
		ОписаниеПользователяИБ,
		,
		"УникальныйИдентификатор,
		|Роли",
		"ПользовательИБ");
	
	Если ПользовательИБОсновной И Не ВходВПрограммуРазрешен Тогда
		ХранимыеСвойства = ПользователиСлужебный.ХранимыеСвойстваПользователяИБ(Объект.Ссылка);
		ПользовательИБАутентификацияСтандартная    = ХранимыеСвойства.АутентификацияСтандартная;
		ПользовательИБАутентификацияOpenID         = ХранимыеСвойства.АутентификацияOpenID;
		ПользовательИБАутентификацияOpenIDConnect  = ХранимыеСвойства.АутентификацияOpenIDConnect;
		ПользовательИБАутентификацияТокеномДоступа = ХранимыеСвойства.АутентификацияТокеномДоступа;
	КонецЕсли;
	
	Если ПользовательИБСуществует Тогда
		ПользовательИБАутентификацияСтандартнаяЗначениеПрямогоИзменения
			= ПользовательИБАутентификацияСтандартная;
	КонецЕсли;
	
	ОбработатьИнтерфейсРолей("ЗаполнитьРоли", ОписаниеПользователяИБ.Роли);
	
	ПриЧтенииВходВПрограммуРазрешен = ВходВПрограммуРазрешен;
	
КонецПроцедуры

&НаСервере
Процедура ОпределитьНесоответствияПользователяСПользователемИБ(ПараметрыЗаписи = Неопределено)
	
	// Проверка соответствия свойства ПолноеИмя пользователяИБ и
	// реквизита Наименование внешнего пользователя. А также значений свойств по умолчанию.
	
	ПоказатьНесоответствие = Истина;
	ПоказатьКомандыУстраненияРазличий = Ложь;
	
	Если НЕ ПользовательИБСуществует Тогда
		ПоказатьНесоответствие = Ложь;
		
	ИначеЕсли Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
		ПользовательИБПолноеИмя = Объект.Наименование;
		ПоказатьНесоответствие = Ложь;
		
	ИначеЕсли УровеньДоступа.УправлениеСписком Тогда
		
		УточнениеСвойств = Новый Массив;
		ЕстьРазличияУстранимыеБезАдминистратора = Ложь;
		
		Если ПользовательИБАутентификацияОС <> Ложь Тогда
			УточнениеСвойств.Добавить(НСтр("ru = 'Аутентификация ОС (включена)'"));
		КонецЕсли;
		
		Если ПриЧтенииВходВПрограммуРазрешен И Объект.Недействителен Тогда
			ВходВПрограммуРазрешен = Ложь;
			УточнениеСвойств.Вставить(0, НСтр("ru = 'Вход в программу разрешен'"));
		КонецЕсли;
		
		Если ЗначениеЗаполнено(УточнениеСвойств) Тогда
			ПоказатьКомандыУстраненияРазличий =
				  УровеньДоступа.НастройкиДляВхода
				И ДействияВФорме.СвойстваПользователяИБ = "Редактирование";
		КонецЕсли;
		
		Если ПользовательИБПолноеИмя <> Объект.Наименование Тогда
			ЕстьРазличияУстранимыеБезАдминистратора = Истина;
			
			УточнениеСвойств.Вставить(0, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Полное имя ""%1""'"),
				ПользовательИБПолноеИмя));
		КонецЕсли;
		
		Если ПользовательИБПользовательОС <> "" Тогда
			УточнениеСвойств.Добавить(НСтр("ru = 'Пользователь ОС (указан)'"));
		КонецЕсли;
		
		Если ПользовательИБПоказыватьВСпискеВыбора Тогда
			ЕстьРазличияУстранимыеБезАдминистратора = Истина;
			УточнениеСвойств.Добавить(НСтр("ru = 'Показывать в списке выбора (включено)'"));
		КонецЕсли;
		
		Если ПользовательИБРежимЗапуска <> "Авто" Тогда
			ЕстьРазличияУстранимыеБезАдминистратора = Истина;
			УточнениеСвойств.Добавить(НСтр("ru = 'Режим запуска (не Авто)'"));
		КонецЕсли;
		
		УстановитьПривилегированныйРежим(Истина);
		ОтличаютсяСохраненныеСвойстваПользователяИБ = ЗначениеЗаполнено(Объект.Ссылка)
			И РегистрыСведений.СведенияОПользователях.ОтличаютсяСохраненныеСвойстваПользователяИБ(Объект);
		УстановитьПривилегированныйРежим(Ложь);
		
		ЕстьРазличияУстранимыеБезАдминистратора =
			ЕстьРазличияУстранимыеБезАдминистратора
			Или ОтличаютсяСохраненныеСвойстваПользователяИБ;
		
		Если УточнениеСвойств.Количество() > 0
		 Или ОтличаютсяСохраненныеСвойстваПользователяИБ Тогда
		
			СтрокаУточненияСвойств = "";
			ТекущаяСтрока = "";
			Для каждого УточнениеСвойства Из УточнениеСвойств Цикл
				Если СтрДлина(ТекущаяСтрока + УточнениеСвойства) > 90 Тогда
					СтрокаУточненияСвойств = СтрокаУточненияСвойств + СокрП(ТекущаяСтрока) + ", " + Символы.ПС;
					ТекущаяСтрока = "";
				КонецЕсли;
				ТекущаяСтрока = ТекущаяСтрока + ?(ЗначениеЗаполнено(ТекущаяСтрока), ", ", "") + УточнениеСвойства;
			КонецЦикла;
			Если ЗначениеЗаполнено(ТекущаяСтрока) Тогда
				СтрокаУточненияСвойств = СтрокаУточненияСвойств + ТекущаяСтрока;
			КонецЕсли;
			Если ПоказатьКомандыУстраненияРазличий
			 Или ЕстьРазличияУстранимыеБезАдминистратора
			   И ДействияВФорме.СвойстваЭлемента = "Редактирование" Тогда
				
				Рекомендация = Символы.ПС
					+ НСтр("ru = 'Нажмите ""Записать"", чтобы устранить различия и не выводить это предупреждение.'");
			
			ИначеЕсли Не Пользователи.ЭтоПолноправныйПользователь() Тогда
				Рекомендация = Символы.ПС
					+ НСтр("ru = 'Обратитесь к администратору, чтобы устранить различия.'");
			Иначе
				Рекомендация = "";
			КонецЕсли;
			Если ЗначениеЗаполнено(СтрокаУточненияСвойств) Тогда
				ПояснениеНесоответствия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Следующие свойства пользователя информационной базы отличаются от указанных в этой форме:
					           |%1.'"),
					СтрокаУточненияСвойств) + ?(Не ОтличаютсяСохраненныеСвойстваПользователяИБ, "", "
					|" + НСтр("ru = 'Картинка в списке внешних пользователей и объектов авторизации может отображать устаревшее состояние,
					                |так как отличаются и некоторые другие сохраненные свойства.'"));
			Иначе
				ПояснениеНесоответствия =
					НСтр("ru = 'Картинка в списке внешних пользователей и объектов авторизации может отображать устаревшее состояние,
					           |так как некоторые свойства пользователя информационной базы отличаются от сохраненных.'");
			КонецЕсли;
			Элементы.СвойстваПояснениеНесоответствия.Заголовок = ПояснениеНесоответствия + Рекомендация;
		Иначе
			ПоказатьНесоответствие = Ложь;
		КонецЕсли;
	Иначе
		ПоказатьНесоответствие = Ложь;
	КонецЕсли;
	
	Элементы.СвойстваОбработкаНесоответствия.Видимость = ПоказатьНесоответствие;
	Элементы.СвойстваПояснениеНесоответствия.ВертикальноеПоложение = ?(ЗначениеЗаполнено(Рекомендация),
		ВертикальноеПоложениеЭлемента.Верх, ВертикальноеПоложениеЭлемента.Центр);
	
	// Определение сопоставления несуществующего пользователя ИБ с пользователем в справочнике.
	ЕстьНовоеСопоставлениеСНесуществующимПользователемИБ =
		НЕ ПользовательИБСуществует И ЗначениеЗаполнено(Объект.ИдентификаторПользователяИБ);
	
	Если ПараметрыЗаписи <> Неопределено
	   И ЕстьСопоставлениеСНесуществующимПользователемИБ
	   И НЕ ЕстьНовоеСопоставлениеСНесуществующимПользователемИБ Тогда
		
		ПараметрыЗаписи.Вставить("ОчищеноСопоставлениеСНесуществующимПользователемИБ", Объект.Ссылка);
	КонецЕсли;
	ЕстьСопоставлениеСНесуществующимПользователемИБ = ЕстьНовоеСопоставлениеСНесуществующимПользователемИБ;
	
	Если УровеньДоступа.УправлениеСписком Тогда
		Элементы.СопоставлениеОбработкаНесоответствия.Видимость = ЕстьСопоставлениеСНесуществующимПользователемИБ;
	Иначе
		// Сопоставление не может быть изменено.
		Элементы.СопоставлениеОбработкаНесоответствия.Видимость = Ложь;
	КонецЕсли;
	
	Если ДействияВФорме.СвойстваЭлемента = "Редактирование" Тогда
		Рекомендация = Символы.ПС
			+ НСтр("ru = 'Нажмите ""Записать"", чтобы устранить проблему и не выводить это предупреждение.'");
		
	ИначеЕсли Не Пользователи.ЭтоПолноправныйПользователь() Тогда
		Рекомендация = Символы.ПС
			+ НСтр("ru = 'Обратитесь к администратору, чтобы устранить различия.'");
	Иначе
		Рекомендация = "";
	КонецЕсли;
	
	Элементы.СопоставлениеПояснениеНесоответствия.Заголовок =
		НСтр("ru = 'Несуществующий пользователь информационной базы.'") + Рекомендация;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Начальное заполнение, проверка заполнения, доступность свойств.

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьДоступностьСвойств(Форма)
	
	Элементы       = Форма.Элементы;
	Объект         = Форма.Объект;
	ДействияВФорме = Форма.ДействияВФорме;
	УровеньДоступа = Форма.УровеньДоступа;
	
	// Пояснение состояния "Нет входа".
	Если Форма.ВходВПрограммуРазрешен Тогда
		Элементы.ГруппаНетПрав.Видимость         = Форма.НаличиеПрав.НетПрав;
		Элементы.ГруппаНетПравНаЗапуск.Видимость = Не Форма.НаличиеПрав.НетПрав
			И Форма.НаличиеПрав.НедостаточноПравДляЗапуска;
		Элементы.ГруппаНетПравНаВход.Видимость   = Не Форма.НаличиеПрав.НетПрав
			И Не Форма.НаличиеПрав.НедостаточноПравДляЗапуска
			И Форма.НаличиеПрав.НедостаточноПравДляВхода;
	Иначе
		Элементы.ГруппаНетПрав.Видимость         = Ложь;
		Элементы.ГруппаНетПравНаЗапуск.Видимость = Ложь;
		Элементы.ГруппаНетПравНаВход.Видимость   = Ложь;
	КонецЕсли;
	
	// Настройка возможности изменения.
	Элементы.ОбъектАвторизации.ТолькоПросмотр
		=   ДействияВФорме.СвойстваЭлемента <> "Редактирование"
		Или Форма.ОбъектАвторизацииЗаданПриОткрытии
		Или   ЗначениеЗаполнено(Объект.Ссылка)
		    И ЗначениеЗаполнено(Объект.ОбъектАвторизации);
	
	Элементы.Недействителен.ТолькоПросмотр =
		Не (ДействияВФорме.СвойстваЭлемента = "Редактирование" И УровеньДоступа.УправлениеСписком);
	
	Элементы.СвойстваПользователяИБ.ТолькоПросмотр =
		Не (  ДействияВФорме.СвойстваПользователяИБ = "Редактирование"
		    И (УровеньДоступа.УправлениеСписком Или УровеньДоступа.ИзменениеТекущего));
	Элементы.ГруппаИмя.ТолькоПросмотр = Элементы.СвойстваПользователяИБ.ТолькоПросмотр;
	
	Элементы.ВходВПрограммуРазрешен.ТолькоПросмотр =
		Не (  Элементы.СвойстваПользователяИБ.ТолькоПросмотр = Ложь
		    И (    УровеньДоступа.ИзменениеРазрешенияНаВход
		       Или УровеньДоступа.ОтключениеРазрешенияНаВход И Форма.ПриЧтенииВходВПрограммуРазрешен));
	
	Элементы.ПользовательИБИмя.ТолькоПросмотр                          = Не УровеньДоступа.НастройкиДляВхода;
	Элементы.ПользовательИБАутентификацияСтандартная.ТолькоПросмотр    = Не УровеньДоступа.НастройкиДляВхода;
	Элементы.ПользовательИБАутентификацияOpenID.ТолькоПросмотр         = Не УровеньДоступа.НастройкиДляВхода;
	Элементы.ПользовательИБАутентификацияOpenIDConnect.ТолькоПросмотр  = Не УровеньДоступа.НастройкиДляВхода;
	Элементы.ПользовательИБАутентификацияТокеномДоступа.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода;
	Элементы.УстановитьРолиНепосредственно.ТолькоПросмотр              = Не УровеньДоступа.НастройкиДляВхода;
	
	Элементы.ПотребоватьСменуПароляПриВходе.ТолькоПросмотр               = Не УровеньДоступа.УправлениеСписком;
	Элементы.ПользовательИБЗапрещеноИзменятьПароль.ТолькоПросмотр        = Не УровеньДоступа.УправлениеСписком;
	Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком;
	
	Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.Доступность    = Не Форма.ПользовательИБЗапрещеноИзменятьПароль;
	
	Элементы.СменитьПароль.Доступность =
		(    УровеньДоступа.НастройкиДляВхода
		 Или УровеньДоступа.ИзменениеТекущего
		   И Не Форма.ПользовательИБЗапрещеноИзменятьПароль);
	
	Элементы.Комментарий.ТолькоПросмотр =
		Не (ДействияВФорме.СвойстваЭлемента = "Редактирование" И УровеньДоступа.УправлениеСписком);
	
	ОбновитьИмяДляВхода(Форма);
	
	// Настройка доступности связанных элементов.
	Элементы.ВходВПрограммуРазрешен.Доступность         = Не Объект.Недействителен;
	Элементы.СвойстваПользователяИБ.Доступность         = Не Объект.Недействителен;
	Элементы.ГруппаИмя.Доступность                      = Не Объект.Недействителен;
	Элементы.РедактированиеИлиПросмотрРолей.Доступность = Не Объект.Недействителен;
	Элементы.ГруппаИзменитьОграничение.Доступность      = Не Объект.Недействителен
	                                                    И Не Элементы.Недействителен.ТолькоПросмотр;
	
	Элементы.ПараметрыАутентификации1СПредприятия.Доступность =
		Форма.ПользовательИБАутентификацияСтандартная;
	
	ПользователиСлужебныйКлиентСервер.ОбновитьОграничениеСрокаДействия(Форма);
	
КонецПроцедуры

// Продолжение процедуры ИзменитьОграничениеНаВходВПрограмму.
&НаКлиенте
Процедура ИзменитьОграничениеНаВходВПрограммуЗавершение(Результат, Контекст) Экспорт
	
	УстановитьДоступностьСвойств(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ТребуетсяЗаписьПользователяИБ(Форма, УчитыватьСтандартноеИмя = Истина)
	
	Если Форма.ДействияВФорме.СвойстваПользователяИБ <> "Редактирование" Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Шаблон = Форма.НачальноеОписаниеПользователяИБ;
	
	ТекущееИмя = "";
	Если Не УчитыватьСтандартноеИмя Тогда
		КраткоеИмя = ПользователиСлужебныйКлиентСервер.ПолучитьКраткоеИмяПользователяИБ(
			Форма.ТекущееПредставлениеОбъектаАвторизации);
		
		Если Форма.ПользовательИБИмя = КраткоеИмя Тогда
			ТекущееИмя = КраткоеИмя;
		КонецЕсли;
	КонецЕсли;
	
	Если Форма.ПользовательИБСуществует
	 Или Форма.ВходВПрограммуРазрешен
	 Или Форма.ПользовательИБИмя                          <> ТекущееИмя
	 Или Форма.ПользовательИБАутентификацияСтандартная    <> Шаблон.АутентификацияСтандартная
	 Или Форма.ПользовательИБЗапрещеноИзменятьПароль      <> Шаблон.ЗапрещеноИзменятьПароль
	 Или Форма.ПользовательИБПароль                       <> Неопределено
	 Или Форма.ПользовательИБАутентификацияOpenID         <> Шаблон.АутентификацияOpenID
	 Или Форма.ПользовательИБАутентификацияOpenIDConnect  <> Шаблон.АутентификацияOpenIDConnect
	 Или Форма.ПользовательИБАутентификацияТокеномДоступа <> Шаблон.АутентификацияТокеномДоступа
	 Или Форма.ПользовательИБЯзык                         <> Шаблон.Язык
	 Или Форма.ПользовательИБРоли.Количество()            <> 0 Тогда
		
		Возврат Истина;
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Для работы интерфейса ролей.

&НаСервере
Процедура ОбработатьИнтерфейсРолей(Действие, ОсновнойПараметр = Неопределено)
	
	ПараметрыДействия = Новый Структура;
	ПараметрыДействия.Вставить("ОсновнойПараметр", ОсновнойПараметр);
	ПараметрыДействия.Вставить("Форма",            ЭтотОбъект);
	ПараметрыДействия.Вставить("КоллекцияРолей",   ПользовательИБРоли);
	ПараметрыДействия.Вставить("НазначениеРолей",  "ДляВнешнихПользователей");
	
	ПользователиСлужебный.ОбработатьИнтерфейсРолей(Действие, ПараметрыДействия);
	
КонецПроцедуры

#КонецОбласти